一、<properties>标签引入外部配置文件

MyBatis可以使用properties来引入外部properties配置文件的内容,其具有两个属性:

  • resource:引入类路径下的资源
  • url:引入网络路径或者磁盘路径下的资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
- MyBatis可以使用<properties>标签来引入外部properties配置文件的内容
- resource:引入类路径下的资源
- url:引入网络路径或磁盘路径下的资源
-->
<properties resource="dbconfig.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.root}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="EmployeeMapper.xml" />
</mappers>
</configuration>

二、<settings>标签运行时行为设置

其有很多设置项可以决定运行时的行为,我们看下其中的一个设置项mapUnderscoreToCamelCase,表示是否开启自动驼峰命名规则映射:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- - MyBatis可以使用<properties>标签来引入外部properties配置文件的内容 - resource:引入类路径下的资源
- url:引入网络路径或磁盘路径下的资源 -->
<properties resource="dbconfig.properties"></properties>
<!--
settings包含很多重要的设置项
setting:用来设置每一个设置项
name:设置项名
value:设置项取值
-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="EmployeeMapper.xml" />
</mappers>
</configuration>

三、<typeAlias>标签

1
2
3
4
5
<!-- typeAliases:别名处理器,可以为Java类型起别名 -->
<typeAliases>
<!-- 为某个Java类型起别名 ,type指定要其别名的类型的全类名,默认别名就是类名小写,alias属性可以指定新的别名-->
<typeAlias type="com.glemontree.mybatis.bean.Employee"/>
</typeAliases>

可以使用<typeAliases>标签为Java类型起别名,其子标签<typeAlias>用来为某个Java类型起别名,type指定要其别名的类型的全类名,默认别名就是类名小写,alias属性可以指定新的别名。

为了对某个包下的所有类起别名,可以使用批量起别名:

1
2
3
4
5
6
7
8
<!-- typeAlias:别名处理器,可以为Java类型起别名,别名不区分大小写 -->
<typeAliases>
<!-- 为某个Java类型起别名 ,type指定要其别名的类型的全类名,默认别名就是类名小写,alias属性可以指定新的别名-->
<!-- <typeAlias type="com.glemontree.mybatis.bean.Employee"/> -->
<!-- package标签可以为某个包下的所有类批量起别名,name属性为包名,会为当前包以及当前包的子包都起一个默认别名(类名小写) -->
<package name="com.glemontree.mybatis.bean"/>
</typeAliases>

还有一种方式可以为类名起别名,就是使用@Alias注解的方式,在批量起别名的情况下,可以使用@Alias 注解为某个类型指定新的别名,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.glemontree.mybatis.bean;
import org.apache.ibatis.type.Alias;
@Alias("emp")
public class Employee {
private Integer id;
private String lastName;
private String email;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Employee [id=" + id + ", lastName=" + lastName + ", email="
+ email + ", gender=" + gender + "]";
}
}

四、<environments>标签

MyBatis可以配置多种环境,其下面可以包含<environment>标签,,用来配置一个具体的环境信息。

<environment>标签必须配置<transactionManager><dataSource>两个子标签:

  • <transactionManager>表示事务管理器,其具有一个属性type,表示事务管理器的类型,共有两种取值,为JDBC (JdbcTransactionFactory)| MANAGED(ManagedTransactionFactory),当然也可以自定义事务管理器,通过实现TransactionFactory来实现自定义事务管理器,此时type属性就是全类名。
  • <dataSource>表示数据源,其具有一个属性type,表示数据源的类型,内置的有三种取值,为UNPOOLED (不使用连接池,UnpooledDataSourceFactory)| POOLED (使用连接池,PooledDataSourceFactory)| JNDI(使用JNDI技术,PooledDataSourceFactory),当然也可以自定义数据源,通过实现DataSource接口即可实现自定义数据源,此时type属性就是全类名。
  • <environment>标签的id属性代表当前环境的唯一标识,通过<environments>标签的default属性指定某种使用环境,从而可以达到快速切换环境的目的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<environments default="development">
<environment id="test">
<transactionManager type=""></transactionManager>
<dataSource type="">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>

五、<databaseIdProvider>标签

MyBatis可以根据数据库厂商执行不同的数据库语句,首先需要在全局配置文件中进行下面的配置:

1
2
3
4
5
6
7
8
9
10
11
12
<!--
databaseIdProvider:支持多数据库厂商
type="DB_VENDOR":VendorDatabaseIdProvider
作用是得到数据库厂商的标识,MyBatis就能根据数据库厂商标识来执行不同的SQL
MySQL,Oracle,SQL Server...
-->
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商起别名 -->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>

然后在SQL映射文件中这样配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<mapper namespace="com.glemontree.mybatis.dao.EmployeeMapper">
<!--
namespace:名称空间;指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
public Employee getEmpById(Integer id);
-->
<select id="getEmpById" resultType="emp" databaseId="mysql">
select * from tbl_employee where id = #{id}
</select>
<select id="getEmpById" resultType="emp" databaseId="oracle">
select EMPLOYEE_ID id, LAST_NAME lastName, EMAIL email from employees where EMPLOYEE_ID = #{id}
</select>
</mapper>

<select>标签具有一个databaseId属性,用来指定在哪个数据库下执行这个语句,这里我们分别配置了mysql和oracle,当当前数据库环境为mysql时就会执行上面的SQL语句,当当前数据库环境为oracle时就会执行下面的SQL语句。

Oracle在where语句中是不能使用字段别名的,所以这里的where语句不能写成where id = #{id},而只能用字段名。

六、<mappers>标签

将写好的映射文件注册到全局配置文件中,<mappers>标签下的<mapper>子标签就是用来注册SQL映射文件的,其具有以下几个属性:

  • resource:引用类路径下的SQL映射文件

  • url:引用网络或磁盘路径下的SQL映射文件

  • class:引用(注册)接口

    • 有SQL映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下

    • 没有SQL映射文件,所有的SQL都是利用注解写在接口上

      1
      2
      3
      4
      public interface EmployeeMapperAnnotation {
      @Select("select * from tbl_employee where id = #{id}")
      public Employee getEmpById(Integer id);
      }

      不要忘记在全局配置文件中进行注册:

      1
      2
      3
      <mappers>
      <mapper class="com.glemontree.mybatis.dao.EmployeeMapperAnnotation"/>
      </mappers>
    • 推荐:比较重要的和复杂的Dao接口写sql映射文件,不重要的和简单的Dao接口为了开发快速可以使用注解。

<mappers>标签下还有一个<package>标签,其可以实现批量注册,但需要注意的是如果是使用SQL映射文件,映射文件名必须与接口同名,并且与接口放在同一目录下。

七、注意点

全局配置文件中这些标签的配置是有顺序的,如果顺序不对也会报错,比如我在实验过程中就发现如果将<databaseIdProvider>标签放在<environments>标签的前面就会报错。